main: Don't look at first GTK_DISPLAY_DEBUG_CHECK parameter...
authorTimm Bäder <mail@baedert.org>
Sat, 7 Jul 2018 09:37:24 +0000 (11:37 +0200)
committerTimm Bäder <mail@baedert.org>
Sun, 8 Jul 2018 07:41:15 +0000 (09:41 +0200)
... if none of the debug displays have any debug flags set. This way, we
can ignore the first parameter to e.g. GTK_DISPLAY_NOTE, which is
usually a call to gtk_widget_get_display.

Before this patch, gtk_widget_get_display was the slowest part of
gtk_widget_query_size_for_orientation.

gtk/gtkmain.c
gtk/gtkprivate.h

index 3377ee3742e07d4077402f4ded72bb50218dc95f..56ab6167d1d882458a4dd517c645f1e19f57c80c 100644 (file)
@@ -152,6 +152,11 @@ typedef struct {
 #define N_DEBUG_DISPLAYS 4
 
 DisplayDebugFlags debug_flags[N_DEBUG_DISPLAYS];
+/* This is a flag to speed up development builds. We set it to TRUE when
+ * any of the debug displays has debug flags >0, but we never set it back
+ * to FALSE. This way we don't need to call gtk_widget_get_display() in
+ * hot paths. */
+gboolean any_display_debug_flags_set = FALSE;
 
 #ifdef G_ENABLE_DEBUG
 static const GDebugKey gtk_debug_keys[] = {
@@ -603,6 +608,7 @@ do_pre_parse_initialization (void)
       debug_flags[0].flags = g_parse_debug_string (env_string,
                                                    gtk_debug_keys,
                                                    G_N_ELEMENTS (gtk_debug_keys));
+      any_display_debug_flags_set = debug_flags[0].flags > 0;
       env_string = NULL;
     }
 #endif  /* G_ENABLE_DEBUG */
@@ -688,6 +694,12 @@ gtk_get_display_debug_flags (GdkDisplay *display)
   return 0;
 }
 
+gboolean
+gtk_get_any_display_debug_flag_set (void)
+{
+  return any_display_debug_flags_set;
+}
+
 void
 gtk_set_display_debug_flags (GdkDisplay *display,
                              guint       flags)
@@ -702,6 +714,9 @@ gtk_set_display_debug_flags (GdkDisplay *display,
       if (debug_flags[i].display == display)
         {
           debug_flags[i].flags = flags;
+          if (flags > 0)
+            any_display_debug_flags_set = TRUE;
+
           return;
         }
     }
index 981e515010cf9cfecd3df73c7d40a91dcd2d913f..3ecb4c36b7bf6a0f7d22761a1f0e33ef6083a246 100644 (file)
@@ -120,10 +120,11 @@ gboolean        gtk_simulate_touchscreen (void);
 void  gtk_set_display_debug_flags (GdkDisplay *display,
                                    guint       flags);
 guint gtk_get_display_debug_flags (GdkDisplay *display);
+gboolean gtk_get_any_display_debug_flag_set (void);
 
 #ifdef G_ENABLE_DEBUG
 
-#define GTK_DISPLAY_DEBUG_CHECK(display,type) G_UNLIKELY (gtk_get_display_debug_flags (display) & GTK_DEBUG_##type)
+#define GTK_DISPLAY_DEBUG_CHECK(display,type) (gtk_get_any_display_debug_flag_set () && G_UNLIKELY (gtk_get_display_debug_flags (display) & GTK_DEBUG_##type))
 #define GTK_DISPLAY_NOTE(display,type,action) \
   G_STMT_START { \
   if (GTK_DISPLAY_DEBUG_CHECK (display,type)) { action; }; \